/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.dao.implementaciones;

import desarrollosoft.ghce.dao.interfaces.IAspectoDAO;
import desarrollosoft.ghce.entidades.AntecedenteNoPatologico;
import desarrollosoft.ghce.entidades.Aspecto;
import desarrollosoft.ghce.entidades.Paciente;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.springframework.stereotype.Repository;

/**
 *
 * @author ariel
 */
@Repository("aspectoDAO")
public class AspectoDAO implements IAspectoDAO {

    @PersistenceContext
    private EntityManager entityManager;
    
    @Override
    public List<Aspecto> obtenerTodosAspectos() {
        Query consulta = entityManager.createQuery(
                "SELECT a FROM Aspecto a ORDER BY a.nombre ASC"
        );
        return consulta.getResultList();
    }

    @Override
    public List<Aspecto> obtenerAspectosCoincidentes(Paciente paciente, Aspecto aspecto) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public boolean loTieneCargado(Paciente paciente, Aspecto aspecto) {
        Query consulta = entityManager.createQuery(
                "SELECT a FROM AntecedenteNoPatologico a WHERE a.paciente = :paciente AND "
                        + "a.aspecto = :aspecto"
        );
        consulta.setParameter("paciente", paciente);
        consulta.setParameter("aspecto", aspecto);
        List<AntecedenteNoPatologico> lista = consulta.getResultList();
        if (lista.isEmpty()) {
            return false;
        }
        return true;
    }

    @Override
    public List<Aspecto> obtenerAspectos(String textoBuscar) {
        Query consulta = entityManager.createQuery(
                "SELECT a FROM Aspecto a WHERE a.nombre LIKE CONCAT(:nombre,'%') ORDER BY a.nombre ASC"
        );
        consulta.setParameter("nombre", textoBuscar);
        return consulta.getResultList();
    }

    @Override
    public void eliminarAspecto(Aspecto aspectoSeleccionado) throws Exception {
        entityManager.remove( entityManager.merge(aspectoSeleccionado) );
    }

    @Override
    public void modificarAspecto(Aspecto aspecto) throws Exception {
        if (existeConMismoNombreYdistintoId(aspecto)) {
            throw new Exception("Ya existe un Aspecto con ese nombre");
        }
        entityManager.merge(aspecto);
    }

    @Override
    public void crearAspecto(Aspecto aspecto) throws Exception {
        if (existeConMismoNombre(aspecto)) {
            throw new Exception("Ya existe un Aspecto con ese nombre");
        }
        entityManager.persist(aspecto);
    }

    private boolean existeConMismoNombreYdistintoId(Aspecto aspecto) {
        Query consulta = entityManager.createQuery(
                "SELECT a FROM Aspecto a WHERE (UPPER(a.nombre) = UPPER(:nombre)) AND a.id <> :id"
        );
        consulta.setParameter("nombre", aspecto.getNombre());
        consulta.setParameter("id", aspecto.getId());
        List<Aspecto> listaResultado = consulta.getResultList();
        if (listaResultado.isEmpty()) {
            return false;
        }
        return true;
    }

    private boolean existeConMismoNombre(Aspecto aspecto) {
        Query consulta = entityManager.createQuery(
                "SELECT a FROM Aspecto a WHERE (UPPER(a.nombre) = UPPER(:nombre))"
        );
        consulta.setParameter("nombre", aspecto.getNombre());
        List<Aspecto> listaResultado = consulta.getResultList();
        if (listaResultado.isEmpty()) {
            return false;
        }
        return true;
    }
    
}
